/*
 * @(#)AntWorld.java			0.1 24/11/2010
 * Copyright (C) 2010 Grupo de Alunos abaixo
 * 
 * Universidade Federal do ABC
 * Vida Artificial - 3o quadrimestre de 2010
 * Aluno: Abner
 * Aluno: Cláudio Antônio Peanho
 * Aluno: Fabrizio Borelli
 * Aluna: Maitê Balhester
 * Aluno: Rafael Munhoz
 * Professora Dr. Karla Vittori
 * Projeto: Simulação de Colônia de Formigas (antcolonyswarm)
 * 
 * Código baseado em jheatbugs-3.0 de Timothy Howe
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.

 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.

 * You should have received a copy of the GNU General Public License
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */
package br.edu.ufabc.va.acs.model;

import java.awt.Point;

import br.edu.ufabc.va.acs.model.agent.Ant;
import br.edu.ufabc.va.acs.model.agent.Food;

import swarm.space.Diffuse2d;
import swarm.space.Discrete2d;

/**
 * @author Peanho
 * 
 */
public interface AntWorld {

	/**
	 * Verifica se a posição no espaço euclidiano bidimensional definida pelas
	 * coordenadas {@code (x,y)} está vazia.
	 * 
	 * @param x
	 *            coordenada x no espaço euclidiano
	 * @param y
	 *            coordenada y no espaço euclidiano
	 * @return {@code true} caso exista objeto na posição, {@code false} do
	 *         contrário.
	 */
	boolean isPositionEmpty(int x, int y);

	/**
	 * Verifica se a posição no espaço euclidiano bidimensional indicada por
	 * {@code pos} está vazia.
	 * 
	 * @param pos
	 *            posição na grade bidimensional
	 * @return {@code true} para posição vazia, {@code false} caso contrário.
	 */
	boolean isPositionEmpty(Point pos);

	/** move uma formiga em {@code from} para a posição {@code to}. */
	void move(Ant ant, Point from, Point to);

	/**
	 * Deposita uma unidade de feromônio na posição {@code pos}.
	 * 
	 * @param pos
	 *            posição em que o feromônio será depositado
	 */
	void depositOnePheromoneUnit(Point pos);

	/**
	 * Deposita {@code amount} unidades de feromônio na posição definida por
	 * {@code pos}.
	 * 
	 * @param pos
	 *            posição na grade
	 * @param amount
	 *            quantidade de feromônio a ser depositado
	 */
	void depositPheromone(Point pos, int amount);

	/**
	 * Realiza a atualização do modelo.
	 */
	Object modelStep();
	
	/** Atualiza a grade de intensidade de feromônios */
	Object updateLattice();

	/**
	 * Retorna a largura da grade bidimensional que representa o mundo.
	 * 
	 * @return largura do mundo
	 */
	int getWidth();

	/**
	 * Retorna a altura da grade bidimensional que representa o mundo.
	 * 
	 * @return altura do mundo
	 */
	int getHeight();

	/**
	 * Retorna a intensidade de feromônio na posição {@code pos}.
	 * 
	 * @param pos
	 *            posição na grade
	 * @return quantidade de feromônio
	 */
	int getPheromoneValueAt(Point pos);
	
	int getPheromoneValueAt(int x, int y);
	
	boolean isFood(Point pos);
	
	boolean isFood(int x, int y);
	
	void collectFood(int x, int y);

	/**
	 * Retorna a grade bidimensional de intensidade de feromônios.
	 * 
	 * @return grade de feromonios
	 */
	Diffuse2d getPheromoneSpace();

	/**
	 * 
	 * @return
	 */
	Discrete2d getScenario();
	
	/**
	 * Retorna a grade bidimensional representando o ambiente com as formigas.
	 * 
	 * @return grade de formigas
	 */
	Discrete2d getWorld();

	/**
	 * @param food
	 * @param i
	 * @param j
	 */
	void addFoodSourceAt(Food food, int i, int j);

	/**
	 * @param nextPos
	 * @return
	 */
	boolean isValidPos(Point pos);
}
